#coding:utf-8

"""@author WTBF"""

# 导入正则表达式模块
import re
# 导入url解析模块
import urllib.parse
# 导入节点解析模块
from bs4 import BeautifulSoup
# html 解析器
# 过程：
# 将字符串传送给网页解析器，一方面解析出有价值的数据，一方面将网页中指向其他网页的url补充给url管理器，形成循环。
# 用到了结构化解析,BeautifuSoup就是使用DOM树的方式来解析网页的。 

class HtmlParser(object):

    """html 解析器"""

    # 定制的url解析器, 获取解析内容得到的定制新数据
    def _get_new_urls(self,page_url,soup):
        # 定义一个set序列用于接收新url
        new_urls = set()
        # 找到内容中所有href带有'/item/'的a标签
        links = soup.find_all('a', href=re.compile(r'/item/'))

        # 循环这些找到的满足条件的a标签
        for link in links:
            # 获取它的href属性
            new_url = link["href"]
            # 使用urlparse.urljoin按照入口url的格式拼接href属性
            new_full_url = urllib.parse.urljoin(page_url, new_url)
            # 拼接完后加进new_urls列表中
            new_urls.add(new_full_url)

        # 返回urls
        return new_urls


    # 定制的内容解析器, 获取解析内容得到的定制内容
    def _get_new_data(self, page_url, soup):
        # 定义接收内容的对象
        res_data = {}
        # 把当前的入口RUL放入对象中
        res_data['url'] = page_url

        # <dd class="lemmaWgt-lemmaTitle-title"><h1>Python</h1>
        # 获取标题的标签
        title_node = soup.find('dd', class_="lemmaWgt-lemmaTitle-title").find("h1")
        # 把标题文字放入对象中
        res_data['title'] = title_node.get_text()
        #<div class="lemma-summary" label-module="lemmaSummary">
        summary_node = soup.find('div', class_="lemma-summary")
        # 把内容文字放入对象中
        res_data['summary'] = summary_node.get_text()

        # 返回内容对象
        return res_data



    # 解析函数入口
    def parse(self, page_url, html_cont):
        # 如果传进来的url为none或者内容为none，就直接退出
        if page_url is None or html_cont is  None:
            return

        # 如果传进来的url和内容都是有效的，就使用html.parser以及utf-8编码来解析内容
        soup = BeautifulSoup(html_cont, 'html.parser')
        # 调用定制的url解析器，并返回解析内容后得到的新url
        new_urls = self._get_new_urls(page_url, soup)
        # 调用定制的内容解析器，并返回解析内容后得到的数据
        new_data = self._get_new_data(page_url, soup)
        # 返回新的urls和数据
        return new_urls, new_data

        